﻿/* PC INpact Toolkit for Chrome™

	PC INpact Toolkit for Chrome™ est une extension destinée au navigateur Chrome permettant d'accéder à de nombreuses fonctionnalités de PC INpact.
	Vous y retrouverez les actualités, brèves, calendriers du site, mais aussi les comptes Twitter de l'équipe ou des fonctionnalités de recherche.
	Des notifications peuvent aussi être affichées sur votre bureau, à chaque nouvelle publication sur le site (actualités, dossiers, tests).

	Main author : LEGRAND David
	Mail : david@pcinpact.com
	
	Google Code Project : http://pci.im/code-pci-chrome 
	Forum : http://pci.im/forum-pci-chrome
	
    This file is part of PC INpact Toolkit for Chrome™.

    PC INpact Toolkit for Chrome™ is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    PC INpact Toolkit for Chrome™ is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with PC INpact Toolkit for Chrome™.  If not, see <http://www.gnu.org/licenses/>. 

    You're not allowed to use PC INpact Toolkit for Chrome™ name or logo without permission 

	Loading GIF : http://www.ajaxload.info/

 */

// On définit des variables qui pourront être utiles au sein de l'extension
var app_name = "PC INpact Toolkit for Chrome™";
var color_red = [255, 0, 0, 255];
var color_green = [46, 139, 87, 255];
var color_blue = [31, 126, 170, 255];

//On définit les textes qui pourront être utilisés lors d'une requête XMLHttpRequest
var charg_text = "<div align=\"center\">En chargement...<br /><br /><img src=\"/pics/loading.gif\" width=220 height=19 alt='loading'></div><div>&nbsp;</div>";
var charg_err = "<div align=\"center\">Erreur lors de la requête...</div>";

//Une fonction qui permet d'ouvrir un nouvel onglet
function open_tab(url) {
	chrome.tabs.create({
		"url" : url
	});
}

//Une fonction qui permet de modifier la taille de certains élements affichés lors du changement d'onglet
function modify_body_size(option) {

	// En fonction de l'option indiquée, on modifie la largeur du header
	switch (option) {
		default:
			document.getElementById("conteneur").style.width = "460px";
			// On ne gèle le cas du logo premium que si l'utilisateur est un membre Premium connecté
			//if (document.getElementById("premium_logo") != null) document.getElementById("premium_logo").style.marginLeft = "12px";
			break;

		case 'scroll':
			document.getElementById("conteneur").style.width = "445px";
			//if (document.getElementById("premium_logo") != null) document.getElementById("premium_logo").style.marginLeft = "5px";
			break;
	}
}

// La fonction qui permet de mettre à jour le badge
function set_badge(text, title, color)
{
	chrome.browserAction.setBadgeText({
		text : text
	});
	chrome.browserAction.setBadgeBackgroundColor({
		color : color
	});
	chrome.browserAction.setTitle({
		title : title
	});
}

// La fonction qui détermine l'état du badge
function badge_update(suffixe) 
{
	// S'il y a des nouvelles actualités
	if(window.localStorage.getItem('badge_count') > 0) 
	{
		// Si l'on traite des actualités, on met le badge en rouge, et on lui attribue la valeur nécessaire
		// On rempli le Tooltip avec le nom de l'extension
		if (suffixe == 'news') set_badge(window.localStorage.getItem('badge_count').toString(), app_name, color_red);
	}
	// S'il y a de nouvelles brèves
	else if (window.localStorage.getItem('breves_new') == 1)
	{
		set_badge('*', app_name, color_blue);
	}
	// Sinon, on regarde du côté du forum
	else {
		// S'il n'y a aucune notification, ou que l'utilisateur a été indiqué comme n'étant pas loggué
		if((window.localStorage.getItem('forum_mess') == 0 && window.localStorage.getItem('forum_notif') == 0) || window.localStorage.getItem('forum_connect') == 0) set_badge('', app_name, color_red);
		// Si c'est le cas, on affiche le '!' et on passe la couleur du badge à vert
		else set_badge('!', "Message(s) : " + window.localStorage.getItem('forum_mess') + " - Notification(s) : " + window.localStorage.getItem('forum_notif'), color_green);
	}
	
}

//La fonction qui prend en charge les requêtes sur un fichier interne
function int_req(file, rub, ss_menu, scroll) {

	window.localStorage.setItem('last_rub_s', rub);
	document.getElementById('ss_menu').innerHTML = ss_menu;
	modify_body_size(scroll);

	// On effectue une requête pour récupérer le fichier
	var xmlhttp = new XMLHttpRequest();
	xmlhttp.open("GET", file, false);
	xmlhttp.send(null);
	
	// On affiche directement le résultat
	document.getElementById('contenu').innerHTML = xmlhttp.responseText;
}

// La fonction gérant les requêtes sur une URL externe de manière synchrone
function ext_req(url, xml) {

	// On traite la requête
	var xmlhttp = new XMLHttpRequest();
	xmlhttp.open("GET", url, false);
	xmlhttp.send(null);
	
	// Si l'on a demandé un objet XML, on le renvoie, sinon on renvoie un texte
	if (xml) return xmlhttp.responseXML;
	else return xmlhttp.responseText;
}

// La fonction qui récupère le Header depuis une URL
function ext_req_head(url, xml) {

	// On traite la requête
	var xmlhttp = new XMLHttpRequest();
	xmlhttp.open("HEAD", url, false);
	xmlhttp.send(null);
	
	return xmlhttp.getAllResponseHeaders();
}

// La fonction d'extraction des paramètres
function extract(chaine, start, end, nb)
{
	var first_index = chaine.indexOf(start);
	var result_temp = chaine.substring(first_index + nb);
	var second_index = result_temp.indexOf(end);
	return result_temp.substring(0, second_index);
}

//La fonction qui gère le premier lancement de l'extension
function first_open() {
	
	// Si un notification d'actualité est en cours, et que l'option de redirection est activée
	// On affiche toutes les actualités par défaut
	if (window.localStorage.getItem('badge_count') > 0 && localStorage["actus_redir_check"] == 1) actus("http://www.pcinpact.com/actu/archive.php");
	
	// S'il y a de nouvelles brèves, et que l'option de redirection est activée
	else if (window.localStorage.getItem('breves_new') == 1 && localStorage["actus_redir_check"] == 1) breves();
	
	// Sinon on effectue un traitement standard
	else
	{
		// On récupère la valeur enregistrée, si elle existe
		var last_rub = window.localStorage.getItem('last_rub_s');

		// Si elle existe
		if(last_rub != null) {
			// On lance la fonction nécessaire
			switch (last_rub) {
				case 'breves':
					breves();
					break;

				case 'cal':
					cal();
					break;

				case 'g_plus':
					g_plus();
					break;

				case 'liens':
					liens();
					break;

				case 'recherche':
					recherche();
					break;

				case 'twitter':
					twitter();
					break;

				case 'actus':
					actus();
					break;

				case 'forum':
					forum();
					break;
				
				case 'premium':
					premium();
					break;

				default:
					actus();
					break;
			}
		}
		// Par défaut, on lance la fonction de lecture des actus
		else {
			actus();
		}
	}
}

////////////////////////////////////////

//Support préliminaire de Google+

////////////////////////////////////////

//Une fonction qui permet de rappatrier du contenu depuis les RSS de Google+
function g_plus(name) {
	window.localStorage.setItem('last_rub_s', 'g_plus');

	// On modifier la taille de l'onglet
	modify_body_size('scroll');

	// On définit les variables
	var url;
	var xmlhttp;

	// on récupère le nom du compte twitter stockée
	var name_s = window.localStorage.getItem('gplus_name_s');

	// On passe le nom à utiliser en paramètre, s'il n'existe pas, on utilise
	// une valeur par défaut, stockée ou non
	if(!name) {
		if(name_s != null) {
			var name = name_s;
		} else {
			var name = "david";
		}
	} else {
		// On l'enregistre
		var name;
		window.localStorage.setItem('gplus_name_s', name);
	}

	// En fonction du paramètre de nom passé à la fonction, on définit les liens
	// Twitter à utiliser
	switch (name) {
		case 'damien':
			url = "http://twitter.com/statuses/user_timeline/64710636.rss";
			var url_util = "http://twitter.com/labdampci";
			break;

		case 'marc':
			url = "http://twitter.com/statuses/user_timeline/20474834.rss";
			var url_util = "http://twitter.com/reesmarc";
			break;

		case 'nil':
			url = "http://twitter.com/statuses/user_timeline/81221767.rss";
			var url_util = "http://twitter.com/NilSanyas";
			break;

		case 'pa':
			url = "http://twitter.com/statuses/user_timeline/83091138.rss";
			var url_util = "http://twitter.com/pa_pci";
			break;

		case 'seb':
			url = "http://twitter.com/statuses/user_timeline/159616305.rss";
			var url_util = "http://twitter.com/seb_pci";
			break;

		case 'vincent':
			url = "http://twitter.com/statuses/user_timeline/99956217.rss";
			var url_util = "http://twitter.com/Vincent_Hermann";
			break;

		case 'rss':
			url = "http://twitter.com/statuses/user_timeline/76874617.rss";
			var url_util = "http://twitter.com/pci_rss";
			break;

		default:
			url = "http://plusfeed.appspot.com/105655478583617612704";
			var url_util = "https://plus.google.com/105655478583617612704";
			break;
	}

	// On définit la requête
	xmlhttp = new XMLHttpRequest();
	xmlhttp.onreadystatechange = function() {
		// si la requête est OK
		if(xmlhttp.readyState == 4) {
			// Si la réponse est vide
			if(xmlhttp.responseText == "") {
				// On définit le texte qui sera affiché en cas d'erreur
				document.getElementById("contenu").innerHTML = charg_err;
			}
			// Sinon
			else {
				// On affiche le contenu du fichier dans le bloc DIV indiqué
				doc = xmlhttp.responseXML.documentElement;

				var twitter_titre = doc.getElementsByTagName("title")[0].childNodes[0].nodeValue
				.replace(" - Google+ User Feed", "");
				var twitter_name = twitter_titre.split(/ \/ /);

				// On affiche un titre et on ouvre le tableau
				var fils = "<div class='tweet_titre'>Flux de " + twitter_name[0] + "</div>";

				// Pour chaque Tweet du flux RSS, on effectue un travail sur la
				// mise en page
				for(var h = 1; h < doc.getElementsByTagName("entry").length; h++) {
					// On supprime le nom de l'utilisateur au début de chaque
					// Tweet
					// On ajoute aussi des balises <a> sur les liens, les # et
					// les @
					var tweet = doc.getElementsByTagName("summary")[h].childNodes[0].nodeValue
					.replace(
					/^labdampci:|^seb_pci:|^davidpci:|^reesmarc:|^NilSanyas:|^pa_pci:|^Vincent_Hermann:|^pci_rss:/gi,
					"")
					.replace(/(\w+):\/\/[\S]+(\b|$)/gim,
					'<a href="$&" target="_blank">$&</a>')
					.replace(
					/(^|\s)#(\w+)/g,
					"$1#<a href=\"http://search.twitter.com/search?q=%23$2\" target=\"_blank\">$2</a>")
					.replace(/(^|\s)@(\w+)/g, "$1@<a href=\"http://www.twitter.com/$2\" target=\"_blank\">$2</a>");
					var tweet_date = new Date(doc.getElementsByTagName("updated")[h].childNodes[0].nodeValue);
					var final_date = tweet_date

					// On affiche le tweet dans un div spécifique
					fils += "<div class='tweet'>" + tweet + "<br /><div style='font-size: 0.8em; margin-top: 5px;'>" + final_date + "</div></div>";
				}

				// On ajoute un lien vers la page Twitter de l'utilisateur en
				// fin de page
				fils += "<div class='tweet_titre_last'><a class=\"head\" href=\"http://twitter.com/" + twitter_name + "\" target=\"_blank\">Voir l'ensemble du flux</a></div>";

				// On défini le menu
				document.getElementById("ss_menu").innerHTML = "<a href=\"\" onclick=\"twitter('damien')\">Damien</a> | " + "<a href=\"\" onclick=\"twitter('david')\">David</a> | " + " <a href=\"\" onclick=\"twitter('marc')\">Marc</a> | " + " <a href=\"\" onclick=\"twitter('nil')\">Nil</a> | " + " <a href=\"\" onclick=\"twitter('pa')\">P-A</a> |" + "<a href=\"\" onclick=\"twitter('seb')\">Sébastien</a> | " + " <a href=\"\" onclick=\"twitter('vincent')\">Vincent</a> ||" + " <a href=\"\" onclick=\"twitter('rss')\">PCi RSS</a> ||" + " <a href=\"http://twitter.com/pcinpact/team\" target=\"_blank\">Team</a>" + " <br /><br />";

				// On affiche le contenu de la page
				document.getElementById("contenu").innerHTML = fils;
			}
		} else {
			// Sinon on affiche le texte de chargement
			// document.getElementById("contenu").innerHTML = charg_text;
		}
	}
	// On envoie la requête
	xmlhttp.open("GET", url, true);
	xmlhttp.send("");
}

////////////////////////////////////////

//Fin du support préliminaire de Google+

////////////////////////////////////////